package main

import (
	"fmt"
	"sort"
)

// 自定义的结构体
type Animal struct {
	Type   string
	Weitht int
}

// 新定义一个切片的类型，下面对这个类型实现interface要求的3个方法
// 直接用 []Animal Go不认，这里应该是起了个别名
type AnimalSlice []Animal

func (a AnimalSlice) Len() int {
	return len(a)
}

func (a AnimalSlice) Less(i, j int) bool {
	return a[i].Weitht < a[j].Weitht
}

func (a AnimalSlice) Swap(i, j int) {
	a[i], a[j] = a[j], a[i]
}

func main() {
	var tiger Animal = Animal{"Tiger", 200}
	var dog Animal = Animal{"Dog", 20}
	var cat Animal = Animal{"Cat", 15}
	var elephant Animal = Animal{"Elephant", 4000}
	// 这里的切片要用自定义的类型，别名被认为是两个不同的类型，只有这个实现了接口的方法
	var data AnimalSlice
	data = append(data, tiger)
	data = append(data, dog)
	data = append(data, cat)
	data = append(data, elephant)
	fmt.Println(data)
	sort.Sort(data)
	fmt.Println(data)
}
